/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hojadetrabajo5dos;
import java.util.Scanner;
import java.util.InputMismatchException;
import java.util.List;
import java.util.ArrayList;
/**
 *
 * @author RAUL
 */
public class HojaDeTrabajo5 {
    static VectorHeap<Ingreso> Clientela = new VectorHeap<Ingreso>();
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
       
        int[] cajas = new int[4];
        int ingreso;
        AbstractCola<Ingreso> Caja1= new ListaCircular<Ingreso>();
        AbstractCola<Ingreso> Caja2= new ListaCircular<Ingreso>(); 
        AbstractCola<Ingreso> Caja3= new ListaCircular<Ingreso>(); 
        AbstractCola<Ingreso> Caja4= new ListaCircular<Ingreso>(); 
        do{
        menu();
        
        
        ingreso = (int)obtenerNumero("¿Que desea realizar ?",true);
        switch(ingreso){
            case 1:
                int cant = (int)obtenerNumero("¿Cuantos clientes ingresara?",true);
                   for (int i=0;i<cant;i++){
                Ingreso cli = new Ingreso();
                Clientela.add(cli);
                cli.setEntrada((int)obtenerNumero("Ingrese el tiempo de entrada para Cliente "+(i+1),true));
                int tiempo = cli.getEntrada();
                
                if(tiempo>= 480){
                    System.out.println("Se ingreso un tiempo mayor al tiempo del banco que es de 480 ");
                   
                }
                else {
                     cli.setTransaccion();
                     cli.setCaja(1); 
                    }
                   }
                for(int j=0;j<Clientela.size();j++){
                    if (Caja1.size() + Caja2.size()+Caja3.size()+Caja4.size()==40)j=Clientela.size()+1;
                    Ingreso cliente = Clientela.getFirst();
                    cliente.setEspera(calcularTiempo(j));
                    cliente.setTotal();
                    Ingreso cliente1 = null;
                    Ingreso cliente2 = null;
                    Ingreso cliente3 = null;
                    Ingreso cliente4 = null;
                    int menor = 0;
                    if(!Caja1.isEmpty()) cliente1 = Caja1.peek();
                    if(!Caja2.isEmpty()) cliente2 = Caja2.peek();
                    if(!Caja3.isEmpty()) cliente3 = Caja3.peek();
                    if(!Caja4.isEmpty()) cliente4 = Caja4.peek();
                    try{
                    if(cliente.getEntrada()>cliente1.getTotal()){ Caja1.poll(); cliente.setEstado(1);System.out.println("Salio un cliente c1.");}
                    if(cliente.getEntrada()>cliente2.getTotal()){ Caja2.poll(); cliente.setEstado(1);System.out.println("Salio un cliente c2.");}
                    if(cliente.getEntrada()>cliente3.getTotal()){ Caja3.poll(); cliente.setEstado(1);System.out.println("Salio un cliente c3.");}
                    if(cliente.getEntrada()>cliente4.getTotal()){ Caja4.poll(); cliente.setEstado(1);System.out.println("Salio un cliente c4.");}
                    }
                    catch(NullPointerException e){}
                    
                    cajas[0]=Caja1.size();
                    cajas[1]=Caja2.size();
                    cajas[2]=Caja3.size();
                    cajas[3]=Caja4.size();
                    menor = getMinValue(cajas)+1;
                   // System.out.println(cajas[0]+","+cajas[1]+","+cajas[2]+","+cajas[3]);
                   // System.out.println(menor);
                    int  totales = 0; 
                    switch(menor){
                        case 1:
                                cliente.setCaja(menor);
                                Caja1.offer(cliente);
                                System.out.println();
                                System.out.println("Se ingreso un cliente en el tiempo: "+cliente.getEntrada());
                                System.out.println("El tiemo de transac es: "+cliente.getTransaccion());
                                System.out.println("El cliente se ingreso a la caja: "+cliente.getCaja());
                                System.out.println("El tiempo total es : "+cliente.getTotal());
                                 
                                break;
                        case 2:
                                cliente.setCaja(menor);
                                Caja2.offer(cliente);
                                System.out.println();
                                System.out.println("Se ingreso un cliente en el tiempo: "+cliente.getEntrada());
                                System.out.println("El tiemo de transac es: "+cliente.getTransaccion());
                                System.out.println("El cliente se ingreso a la caja: "+cliente.getCaja());
                                System.out.println("El tiempo total es : "+cliente.getTotal());
                                 
                                break;
                        case 3:
                                cliente.setCaja(menor);
                                Caja3.offer(cliente);
                                System.out.println();
                                System.out.println("Se ingreso un cliente en el tiempo: "+cliente.getEntrada());
                                System.out.println("El tiemo de transac es: "+cliente.getTransaccion());
                                System.out.println("El cliente se ingreso a la caja: "+cliente.getCaja());
                                 System.out.println("El tiempo total es : "+cliente.getTotal());
                                
                                break;
                        case 4: 
                                cliente.setCaja(menor);
                                Caja4.offer(cliente);
                                System.out.println();
                                System.out.println("Se ingreso un cliente en el tiempo: "+cliente.getEntrada());
                                System.out.println("El tiemo de transac es: "+cliente.getTransaccion());
                                System.out.println("El cliente se ingreso a la caja: "+cliente.getCaja());
                                System.out.println("El tiempo total es : "+cliente.getTotal());
                               
                                break; 
                    }
                    
                     Caja1.offer(cliente);
                     totales+= cliente.getTotal(); 
                     Caja2.offer(cliente);
                     totales+=  cliente.getTotal(); 
                     Caja3.offer(cliente);
                     totales+= cliente.getTotal();
                     Caja4.offer(cliente);
                     totales+= cliente.getTotal();
                     System.out.println("el total es " + totales ); 
                   
                }
                    int contador =0;
                    do{
                    Ingreso cliente1 = new Ingreso();
                    Ingreso cliente2 = new Ingreso();
                    Ingreso cliente3 = new Ingreso();
                    Ingreso cliente4 = new Ingreso();
                    if(!Caja1.isEmpty()) cliente1 = Caja1.peek();
                    if(!Caja2.isEmpty()) cliente2 = Caja2.peek();
                    if(!Caja3.isEmpty()) cliente3 = Caja1.peek();
                    if(!Caja4.isEmpty()) cliente4 = Caja2.peek();
                    if(!(cliente1.getTotal()==0))cajas[0] = cliente1.getTotal();
                    else cajas[0]=1;
                    if(!(cliente2.getTotal()==0))cajas[1] = cliente2.getTotal();
                    else cajas[1] = 1;
                    if(!(cliente3.getTotal()==0))cajas[2] = cliente3.getTotal();
                    else cajas[2]= 1;
                    if(!(cliente4.getTotal()==0))cajas[3] = cliente4.getTotal();
                    else cajas[3]= 1;
                    if(cajas[0]== 1){
                        if(cajas[1]== 1){
                            if(cajas[2]== 1 ){
                                if(cajas[3]== 1){
                                    contador=4;
                                    break;
                                }
                            }
                        }
                    }
                             
                    }while(contador!=4);
                
                      
           
        }
        }while(ingreso != 2);
        
        
    }
    
    /**
     * 
     */
    public static void menu(){
        System.out.println();
        System.out.println("---------Simulacion de Banco----------------");
        System.out.println("                                            ");
        System.out.println(" 1. Ingresar Clientes.                      ");
        System.out.println(" 2. Salir.                                  ");
        System.out.println("--------------------------------------------");
    }
    
    /**
         * 
         * @param numbers es el parametro de las cantidades de gentes en cada cola 
         * @return regresa en donde se encuentra la menor cantidad de personas en la cola 
         */
        public static int getMinValue(int[] numbers){  
        int minValue = numbers[0]; 
        int ret=0;
        for(int i=1;i<numbers.length;i++){  
            if(numbers[i] < minValue){  
                minValue = numbers[i];
                ret = i;
            }  
        }  
        return ret;  
    }  
    
        /**
         * 
         * @param ind es el timepo que debe de esperar en la cola hasta que sean atendidos 
         * @return el tiempo que se tarda en la transaccion 
         */
        public static int calcularTiempo(int indice){
          int cantidad=0;
          Ingreso clien2 = Clientela.getFirst();
          Ingreso clien;
          int cajaa = clien2.getCaja();
          int result=0;
          for(int otro=indice-1;otro>0;otro--){
              clien = Clientela.getFirst();
              cantidad = clien.getCaja();
              if(cantidad==cajaa) {
                  if(clien.getEstado()==0){
                  result += clien2.getTransaccion();
                  }
              }
          }
          return result;
      }  
        
     /**
     * 
     * @param mensaje este es el numero que se ingresa y verifica que este en el rango
     * @param mostrar dependiendo si es true or false hace una operacion especifica 
     * @return
     */
    public static double obtenerNumero(String mensaje, boolean mostrar){
        Scanner ingreso = new Scanner(System.in);
        double num = -1;
        
        System.out.print(mensaje);
        try{
            num = ingreso.nextDouble();
        }
        catch(InputMismatchException exception){
            if (mostrar)
                System.out.println("\nERROR: ~~> Dato invalido. :O(\n");
        }
        finally{
            ingreso.nextLine();//Atrapar el ENTER
        }
        return num;
        }
         
}

    
    
    



